﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace _12306Bot
{
    public class ErrLog
    {
        /// <summary>
        /// 获取页面上会alert的报错信息
        /// </summary>
        /// <param name="strRtn">服务器返回的页面</param>
        /// <returns>出错内容</returns>
        public static String GetAlertMessage(String strPage)
        {
            Regex rgRTN = new Regex("var message = \"(.+)?\";\r\n *?var messageShow");
            return rgRTN.Match(strPage).Groups[1].Value;
        }

        /// <summary>
        /// 获取页面上红色显示的报错信息
        /// </summary>
        /// <param name="strPage">服务器返回的页面</param>
        /// <returns>出错内容</returns>
        public static String GetSpanErr(String strPage)
        {
            Regex rgRTN = new Regex("<span id=\"randErr\"> <img\\w|.*style=\"color: red;\">(.+)</span>");
            return rgRTN.Match(strPage).Groups[1].Value;
        }

        /// <summary>
        /// 往文本框中写入页面上的出错信息，并返回错误代码
        /// <para>错误码：E打头表示需要中断程序；W打头表示不需中断程序</para>
        /// <para>E01：密码错；E02：用户名错；E03：重复订票；E04：有未处理的订单；E05：被踢；E06：非法的订票请求；E99：未知错误</para>
        /// <para>正确马：C打头</para>
        /// <para>W01：验证码出错；W02：车次售票时间未到；W03：发车日期不在预售期内</para>
        /// </summary>
        /// <param name="strPage">服务器返回的页面</param>
        /// <param name="txtOutput">要输出错误信息的文本框</param>
        /// <returns>错误代码</returns>
        public static String Write(String strPage, TextBox txtOutput)
        {
            //已知错误
            if (strPage.Contains("密码输入错误"))
            {
                txtOutput.AppendText("【错误】密码输入错误。" + "\r\n");
                return "E01";
            }
            if (strPage.Contains("登录名不存在"))
            {
                txtOutput.AppendText("【错误】登录名不存在。" + "\r\n");
                return "E02";
            }
            if (strPage.Contains("互联网售票实行实名制"))
            {
                txtOutput.AppendText("【错误】该身份证号码已经订过同时间同车次的票了。" + "\r\n");
                return "E03";
            }
            //页面上会alert的报错信息
            //不得使用strPage.Contains因为可能页面上包含了出错信息，但是页面未出错，不会alert出来。
            String strAlertMsg = GetAlertMessage(strPage);
            if (strAlertMsg.Contains("您还有未处理的订单"))
            {
                txtOutput.AppendText("【错误】您还有未处理的订单。" + "\r\n");
                return "E04";
            }
            if (strAlertMsg.Contains("您还没有登录或者离开页面的时间过长，请登录系统或者刷新页面"))
            {
                txtOutput.AppendText("【错误】你被踢了。" + "\r\n");
                return "E05";
            }
            //非法的订票请求
            if (strPage.Contains("非法的订票请求"))
            {
                txtOutput.AppendText("【错误】非法的订票请求。程序将中止。如反复出现此错误，说明官网已升级，本版本已无法订票。" + "\r\n");
                return "E06";
            }


            //登陆验证码错误
            if (strPage.Contains("请输入正确的验证码"))
            {
                txtOutput.AppendText("【警告】验证码不正确，将重新获取。" + "\r\n");
                return "W01";
            }
            //订票验证码错误
            if (strPage.Contains("输入的验证码不正确"))
            {
                txtOutput.AppendText("【警告】验证码不正确，将重新获取。" + "\r\n");
                return "W01";
            }
            //车次售票时间未到
            if (strPage.Contains("车次售票时间未到"))
            {
                txtOutput.AppendText("【警告】车次售票时间未到。此错误为传说中的错误，作者并未亲历，也不知道如何应对。希望你及时与我联系，告知车次、日期、操作时间，并提交日志，谢谢。" + "\r\n");
                return "W02";
            }
            //发车日期不在预售期内
            if (strPage.Contains("发车日期不在预售期内"))
            {
                txtOutput.AppendText("【警告】发车日期不在预售期内。理论上不会出现这个问题。希望你及时与我联系，告知车次、日期、操作时间，并提交日志，谢谢。" + "\r\n");
                return "W03";
            }
            //请重新查询最新余票信息
            if (strAlertMsg.Contains("请重新查询最新余票信息"))
            {
                txtOutput.AppendText("【错误】系统要求重新查询余票。" + "\r\n");
                return "W04";
            }
            //页面上有将被alert出来的信息，则输出并返回
            if (strAlertMsg != "")
            {
                txtOutput.AppendText("【未知错误】" + strAlertMsg + "\r\n");
                return "W99";
            }
            //页面上红色显示的报错信息
            String strSpanErr = GetSpanErr(strPage);
            if (strSpanErr != "")
            {
                txtOutput.AppendText("【未知错误】" + strSpanErr + "\r\n");
                return "W99";
            }
            //正确返回C方便后面用首字母进行判断
            return "C";
        }
    }
}
